package com.shareyi.springcore.beanlife;

import com.shareyi.springcore.scan.MyScanner;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;

/**
 *
 *
 *
 *1、实现BeanFactoryPostProcessor 接口，会被Application contexts自动发现
  2、BeanFactoryPostProcessor 仅仅对 bean definitions 发生关系，不能对bean instances 交互，对bean instances 的交互，由BeanPostProcessor的实现来处理
  3、PropertyResourceConfigurer 是一个典型的实现


  有什么用处？
   可以获取一些properties数据，并放入
    MyFilePlaceHolderBeanFactoryPostProcessor
 extends PropertyPlaceholderConfigurer

 其中 PropertyResourceConfigurer就实现了该接口，从而获取properties数据，并加载到BeanFactory的属性值中，来进行属性注入。
 如果自己实现一个，可以从远程http获取properties并注入进去，不过有风险，就是网络不通，容易出问题。



 * Created by david on 2017/5/14.
 */
@Service
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor,ApplicationContextAware {

    private ApplicationContext applicationContext;

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }



    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        System.out.println("MyBeanFactoryPostProcessor postProcessBeanFactory 被调用了，我现在还不知道我能干啥？");
        System.out.println("MyBeanFactoryPostProcessor postProcessBeanFactory 我开始明白我的作用了，我是在beanFactory创建完成后，就会调用我，这时候其它bean还没创建呢！");
        /**
         * 由此看来，我们可以对这个beanFactory的一些可配置项进行调整。
         */

        MyScanner myScanner=new MyScanner((BeanDefinitionRegistry) configurableListableBeanFactory);
        myScanner.setResourceLoader(this.applicationContext);
        myScanner.scan("com.shareyi.springcore.scanbean");
    }



}
